package mt.client;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import mt.Order;
import mt.dummy.ClientCommDummy;
import mt.dummy.MicroTraderClientDummy;

/**
 * @author Diogo Sim�es N�55494, Samuel Martins N�38011, Antonio Costa n�54758
 */
public class GUI extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * construtor da GUI recebe como par�metro um clientComm do tipo
	 * ClientCommDummy executa o m�todo initComponents()
	 * 
	 * @param clientComm
	 *            ClientCommDummy
	 */
	public GUI(final ClientCommDummy clientComm) {
		client = clientComm;
		initComponents();
	}

	// funcao initComponents, inicializa todas as variaveis necess�rias � GUI (
	// comunicac�o com o cliente
	/**
	 * Inicializa todas as vari�veis utilizadas pela GUI Constroi e controla
	 * todas as 5 frames utilizadas (Gui, Menus, painelDeCompra, painelDeVenda,
	 * paineDeHistorico)
	 */
	private void initComponents() {
		// ordem de compra/venda
		order = null;
		// cliente
		// client = new ClientCommDummy();
		// micro trader client ( comunicac�o com o servidor )
		micro = new MicroTraderClientDummy();
		// frames utilizadas para os varios paineis acedidos pelo cliente
		painelDeVenda = new JFrame();
		painelDeCompra = new JFrame();
		painelDeHistorico = new JFrame();
		menus = new JFrame();
		// Bot�es
		submitCompra = new JButton();
		botaoSubmitCompra = new JButton();
		botaoSubmitVenda = new JButton();
		botaoVerHistorico = new JButton();
		botaoDisconectar = new JButton();
		submitVenda = new JButton();
		botaoVoltar = new JButton();
		BotaoLigar = new JButton();
		// Labels
		jLabel3 = new JLabel();
		jLabel4 = new JLabel();
		jLabel5 = new JLabel();
		jLabel6 = new JLabel();
		jLabel7 = new JLabel();
		jLabel8 = new JLabel();
		jLabel9 = new JLabel();
		jLabel10 = new JLabel();
		jLabel11 = new JLabel();
		jLabel1 = new JLabel();
		jLabel2 = new JLabel();
		// Campos de insercao de dados - compra
		tipoAccaoCompra = new JTextField();
		qtCompra = new JTextField();
		precoUnidCompra = new JTextField();
		// Campos de insercao de dados - venda
		tipoAccaoVenda = new JTextField();
		qtVenda = new JTextField();
		precoUnidVenda = new JTextField();
		// nickname
		nickName = new JTextField();

		// paineis de visualizacao de ordens (compra e venda)
		textArea1 = new JTextArea();
		textAreaMessages = new JTextArea();

		// Adicionar actionlisteners aos bot�es
		// bot�o botaoSubmitCompra
		botaoSubmitCompra.setText("Submeter Ordens de compra");
		botaoSubmitCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				botaoSubmitCompraActionPerformed(evt);
			}
		});

		// bot�o botaoSubmitVenda
		botaoSubmitVenda.setText("Submeter Ordens de Venda");
		botaoSubmitVenda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				botaoSubmitVendaActionPerformed(evt);
			}
		});

		// bot�o botaoVerHistorico
		botaoVerHistorico.setText("Ver historico das suas Ordens");
		botaoVerHistorico.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				botaoVerHistoricoActionPerformed(evt);
			}
		});

		// bot�o botaoDisconectar
		botaoDisconectar.setText("Desconectar");
		botaoDisconectar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				botaoDisconectarActionPerformed(evt);
			}
		});

		// 2� painel - Menus
		// criac�o layout do tipo GroupLayout
		GroupLayout MenusLayout = new GroupLayout(menus.getContentPane());
		menus.getContentPane().setLayout(MenusLayout);
		// implementac�o do layout � frame menus e adic�o de todos os
		// componentes relevantes
		MenusLayout
				.setHorizontalGroup(MenusLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addGroup(
								MenusLayout
										.createSequentialGroup()
										.addGroup(
												MenusLayout
														.createParallelGroup(
																GroupLayout.Alignment.LEADING)
														.addComponent(
																botaoSubmitVenda,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.DEFAULT_SIZE,
																Short.MAX_VALUE)
														.addComponent(
																botaoSubmitCompra,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.DEFAULT_SIZE,
																Short.MAX_VALUE)
														.addComponent(
																botaoVerHistorico,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.DEFAULT_SIZE,
																Short.MAX_VALUE)
														.addComponent(
																botaoDisconectar))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(textAreaMessages,
												GroupLayout.PREFERRED_SIZE,
												500, GroupLayout.PREFERRED_SIZE)));
		MenusLayout.setVerticalGroup(MenusLayout
				.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(
						MenusLayout
								.createSequentialGroup()
								.addComponent(botaoSubmitVenda)
								.addGap(1, 1, 1)
								.addComponent(botaoSubmitCompra)
								.addGap(1, 1, 1)
								.addComponent(botaoVerHistorico)
								.addPreferredGap(
										LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(botaoDisconectar)
								.addContainerGap(22, Short.MAX_VALUE))
				.addComponent(textAreaMessages, GroupLayout.DEFAULT_SIZE,
						GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));

		jLabel3.setText("Coloque uma ordem de compra:");

		jLabel4.setText("Insira o Tipo de Stock:");

		jLabel5.setText("Insira a quantidade a comprar:");

		jLabel6.setText("Preco por unidade:");
		tipoAccaoCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				tipoAccaoCompraActionPerformed(evt);
			}
		});

		// campo qtCompra
		qtCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				qtCompraActionPerformed(evt);
			}
		});

		// campo precoUnidCompra
		precoUnidCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				precoUnidCompraActionPerformed(evt);
			}
		});

		// bot�o submitCompra
		submitCompra.setText("Submeter");
		submitCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				submitCompraActionPerformed(evt);
			}
		});

		// 3� painel - Compra
		// criac�o layout do tipo GroupLayout
		GroupLayout painelDeCompraLayout = new GroupLayout(
				painelDeCompra.getContentPane());
		painelDeCompra.getContentPane().setLayout(painelDeCompraLayout);
		// implementac�o do layout � frame painelDeCompra e adic�o de todos os
		// componentes relevantes
		painelDeCompraLayout
				.setHorizontalGroup(painelDeCompraLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addGroup(
								painelDeCompraLayout.createSequentialGroup()
										.addComponent(jLabel3)
										.addGap(0, 0, Short.MAX_VALUE))
						.addGroup(
								painelDeCompraLayout
										.createSequentialGroup()
										.addComponent(jLabel4,
												GroupLayout.DEFAULT_SIZE, 121,
												Short.MAX_VALUE)
										.addGap(18, 18, 18)
										.addComponent(jLabel5,
												GroupLayout.DEFAULT_SIZE, 154,
												Short.MAX_VALUE)
										.addGap(18, 18, 18)
										.addComponent(jLabel6,
												GroupLayout.DEFAULT_SIZE, 99,
												Short.MAX_VALUE))
						.addGroup(
								painelDeCompraLayout
										.createSequentialGroup()
										.addComponent(tipoAccaoCompra)
										.addGap(18, 18, 18)
										.addGroup(
												painelDeCompraLayout
														.createParallelGroup(
																GroupLayout.Alignment.LEADING)
														.addGroup(
																painelDeCompraLayout
																		.createSequentialGroup()
																		.addComponent(
																				submitCompra)
																		.addGap(0,
																				0,
																				Short.MAX_VALUE))
														.addGroup(
																painelDeCompraLayout
																		.createSequentialGroup()
																		.addComponent(
																				qtCompra)
																		.addGap(18,
																				18,
																				18)
																		.addComponent(
																				precoUnidCompra)))));
		painelDeCompraLayout
				.setVerticalGroup(painelDeCompraLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addGroup(
								painelDeCompraLayout
										.createSequentialGroup()
										.addComponent(jLabel3)
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												painelDeCompraLayout
														.createParallelGroup(
																GroupLayout.Alignment.BASELINE)
														.addComponent(jLabel4)
														.addComponent(jLabel5)
														.addComponent(jLabel6))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												painelDeCompraLayout
														.createParallelGroup(
																GroupLayout.Alignment.BASELINE)
														.addComponent(
																tipoAccaoCompra,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE)
														.addComponent(
																qtCompra,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE)
														.addComponent(
																precoUnidCompra,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(submitCompra)
										.addContainerGap()));

		jLabel7.setText("Coloque uma ordem de venda:");

		jLabel8.setText("Insira o Tipo de Stock:");

		jLabel9.setText("Insira a quantidade a vender:");

		jLabel10.setText("Preco por unidade:");

		// Adicionar actionlisteners aos campos de insercao de dados
		// campo precoUnidVenda
		precoUnidVenda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				precoUnidVendaActionPerformed(evt);
			}
		});

		// campo qtVenda
		qtVenda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				qtVendaActionPerformed(evt);
			}
		});

		// campo tipoAccaoVenda
		tipoAccaoVenda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				tipoAccaoVendaActionPerformed(evt);
			}
		});

		// bot�o submitVenda
		submitVenda.setText("Submeter");
		submitVenda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				submitVendaActionPerformed(evt);
			}
		});

		// 4� painel - Venda
		// criac�o layout do tipo GroupLayout
		GroupLayout PainelDeVendaLayout = new GroupLayout(
				painelDeVenda.getContentPane());
		painelDeVenda.getContentPane().setLayout(PainelDeVendaLayout);
		// implementac�o do layout � frame painelDeVenda e adic�o de todos os
		// componentes relevantes
		PainelDeVendaLayout
				.setHorizontalGroup(PainelDeVendaLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addComponent(jLabel7)
						.addGroup(
								PainelDeVendaLayout
										.createSequentialGroup()
										.addGroup(
												PainelDeVendaLayout
														.createParallelGroup(
																GroupLayout.Alignment.LEADING,
																false)
														.addComponent(
																jLabel8,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.DEFAULT_SIZE,
																Short.MAX_VALUE)
														.addComponent(
																tipoAccaoVenda,
																GroupLayout.PREFERRED_SIZE,
																115,
																GroupLayout.PREFERRED_SIZE))
										.addGap(18, 18, 18)
										.addGroup(
												PainelDeVendaLayout
														.createParallelGroup(
																GroupLayout.Alignment.LEADING,
																false)
														.addComponent(qtVenda)
														.addComponent(
																jLabel9,
																GroupLayout.PREFERRED_SIZE,
																144,
																GroupLayout.PREFERRED_SIZE))
										.addGap(18, 18, 18)
										.addGroup(
												PainelDeVendaLayout
														.createParallelGroup(
																GroupLayout.Alignment.LEADING,
																false)
														.addComponent(
																jLabel10,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.DEFAULT_SIZE,
																Short.MAX_VALUE)
														.addComponent(
																precoUnidVenda,
																GroupLayout.PREFERRED_SIZE,
																91,
																GroupLayout.PREFERRED_SIZE)))
						.addGroup(
								PainelDeVendaLayout.createSequentialGroup()
										.addGap(178, 178, 178)
										.addComponent(submitVenda)));
		PainelDeVendaLayout
				.setVerticalGroup(PainelDeVendaLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addGroup(
								PainelDeVendaLayout
										.createSequentialGroup()
										.addComponent(jLabel7)
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												PainelDeVendaLayout
														.createParallelGroup(
																GroupLayout.Alignment.BASELINE)
														.addComponent(jLabel8)
														.addComponent(jLabel9)
														.addComponent(jLabel10))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												PainelDeVendaLayout
														.createParallelGroup(
																GroupLayout.Alignment.BASELINE)
														.addComponent(
																tipoAccaoVenda,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE)
														.addComponent(
																qtVenda,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE)
														.addComponent(
																precoUnidVenda,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(submitVenda)));

		jLabel11.setText("Consulte aqui o seu Historico de ordens:");

		// Adicionar actionlisteners ao bot�o
		// bot�o botaoVoltar
		botaoVoltar.setText("Voltar");
		botaoVoltar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				botaoVoltarActionPerformed(evt);
			}
		});

		// 5� painel - Historico
		// criac�o layout do tipo GroupLayout
		GroupLayout PainelDeHistoricoLayout = new GroupLayout(
				painelDeHistorico.getContentPane());
		painelDeHistorico.getContentPane().setLayout(PainelDeHistoricoLayout);
		// implementac�o do layout � frame painelDeHistorico e adic�o de todos
		// os componentes relevantes
		PainelDeHistoricoLayout.setHorizontalGroup(PainelDeHistoricoLayout
				.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(
						PainelDeHistoricoLayout
								.createSequentialGroup()
								.addComponent(jLabel11)
								.addPreferredGap(
										LayoutStyle.ComponentPlacement.RELATED,
										173, Short.MAX_VALUE)
								.addComponent(botaoVoltar))
				.addComponent(textArea1, GroupLayout.DEFAULT_SIZE,
						GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
		PainelDeHistoricoLayout
				.setVerticalGroup(PainelDeHistoricoLayout
						.createParallelGroup(GroupLayout.Alignment.LEADING)
						.addGroup(
								PainelDeHistoricoLayout
										.createSequentialGroup()
										.addGroup(
												PainelDeHistoricoLayout
														.createParallelGroup(
																GroupLayout.Alignment.BASELINE)
														.addComponent(jLabel11)
														.addComponent(
																botaoVoltar))
										.addPreferredGap(
												LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(textArea1,
												GroupLayout.DEFAULT_SIZE, 244,
												Short.MAX_VALUE)));

		setDefaultCloseOperation(EXIT_ON_CLOSE);

		jLabel1.setText("Insira o seu nickname e clique para ligar ao servidor");

		// Adicionar actionlisteners ao bot�o
		// bot�o BotaoLigar
		BotaoLigar.setText("Ligar");
		BotaoLigar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				BotaoLigarActionPerformed(evt);
			}
		});

		jLabel2.setText("*O Nickname nao pode estar vazio.");

		// 1� painel - Log In
		// criac�o layout do tipo GroupLayout
		GroupLayout layout = new GroupLayout(getContentPane());
		// implementac�o do layout � frame gui e adic�o de todos os componentes
		// relevantes
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(layout
				.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGroup(
										layout.createParallelGroup(
												GroupLayout.Alignment.TRAILING)
												.addGroup(
														layout.createSequentialGroup()
																.addComponent(
																		nickName,
																		GroupLayout.PREFERRED_SIZE,
																		159,
																		GroupLayout.PREFERRED_SIZE)
																.addGap(33, 33,
																		33)
																.addComponent(
																		BotaoLigar))
												.addComponent(jLabel1)
												.addComponent(
														jLabel2,
														GroupLayout.Alignment.LEADING))
								.addGap(0, 8, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout
				.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addComponent(jLabel1)
								.addPreferredGap(
										LayoutStyle.ComponentPlacement.UNRELATED)
								.addGroup(
										layout.createParallelGroup(
												GroupLayout.Alignment.BASELINE)
												.addComponent(
														nickName,
														GroupLayout.PREFERRED_SIZE,
														GroupLayout.DEFAULT_SIZE,
														GroupLayout.PREFERRED_SIZE)
												.addComponent(BotaoLigar))
								.addPreferredGap(
										LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jLabel2)));
		setResizable(false);
		pack();
	}

	// Bot�o BotaoLigar foi carregado
	/**
	 * Este m�todo � invocado quando o ActionListener do bot�o BotaoLigar, da
	 * frame Gui, recebe um evento evt (clique). Efectua a conecc�o do
	 * utilizador - cliente - ao servidor atrav�s do connect() Abre nova frame
	 * Menus
	 * 
	 */
	private void BotaoLigarActionPerformed(ActionEvent evt) {
		// verifica se o campo est� vazio
		if (nickName.getText().length() > 0) {
			// conecta o cliente executando o connect() e enviando o host e o
			// nickname
			client.connect("localhost", nickName.getText());
			// "lanca" nova janela ( menus )
			textAreaMessages.setEditable(false);
			menus.setVisible(true);
			menus.setResizable(false);
			menus.repaint();
			menus.validate();
			menus.pack();
			// fecha janela actual ( Log In )
			this.dispose();
			System.out.println("User: " + nickName.getText()
					+ " has connected.");

		}
	}

	// Bot�o botaoSubmitCompra foi carregado
	/**
	 * Abre nova frame painelDeCompra
	 */
	private void botaoSubmitCompraActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( painelDeCompra )
		painelDeCompra.setVisible(true);
		painelDeCompra.setResizable(false);
		painelDeCompra.repaint();
		painelDeCompra.validate();
		painelDeCompra.pack();
		// fecha janela actual ( menus )
		menus.dispose();
	}

	// Bot�o botaoSubmitVenda foi carregado
	/**
	 * Abre nova frame painelDeVenda
	 */
	private void botaoSubmitVendaActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( painelDeVenda )
		painelDeVenda.setVisible(true);
		painelDeVenda.setResizable(false);
		painelDeVenda.repaint();
		painelDeVenda.validate();
		painelDeVenda.pack();
		// fecha janela actual ( menus )
		menus.dispose();
	}

	// Bot�o botaoVerHistorico foi carregado
	/**
	 * Abre nova frame painelDeHistorico
	 */
	private void botaoVerHistoricoActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( painelDeVenda )
		painelDeHistorico.setVisible(true);
		textArea1.setEditable(false);
		painelDeHistorico.repaint();
		painelDeHistorico.validate();
		painelDeHistorico.pack();
		// fecha janela actual ( menus )
		menus.dispose();
	}

	// Bot�o botaoDisconectar foi carregado
	/**
	 * Disconecta utilizador - cliente - do servidor atrav�s do disconnect()
	 * Fecha o programa
	 */
	private void botaoDisconectarActionPerformed(ActionEvent evt) {
		// disconecta utilizador
		client.disconnect();
		// fecha janela actual ( menus )
		menus.dispose();
		System.out.println("User: " + nickName.getText() + " desconectou-se.");
		// termina programa
		System.exit(0);

	}

	/**
	 * Retira tipoAccaoCompra da JTextField
	 */
	private void tipoAccaoCompraActionPerformed(ActionEvent evt) {
		this.tipoAccaoCompra = tipoAccaoCompra;

	}

	/**
	 * Retira qtCompra da JTextField
	 */
	private void qtCompraActionPerformed(ActionEvent evt) {
		this.qtCompra = qtCompra;
	}

	/**
	 * Retira precoUnidCompra da JTextField
	 */
	private void precoUnidCompraActionPerformed(ActionEvent evt) {
		this.precoUnidCompra = precoUnidCompra;
	}

	// Bot�o submitCompra foi carregado
	/**
	 * Este m�todo cria uma nova ordem de compra atrav�s createBuyOrder(),
	 * enviando como parametros os dados introduzidos pelo utilizador
	 * precoUnidCompra, qtCompra, tipoAccaoCompra Envia essa ordem de compra
	 * para o servidor atrav�s do sendOrder() Adiciona ordem ao historico do
	 * utilizador - cliente Limpa as JTextFields Abre novamente a frame Menus
	 */
	@SuppressWarnings("static-access")
	private void submitCompraActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( menus )
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.validate();
		menus.pack();
		// fecha janela actual ( painelDeCompra )
		painelDeCompra.dispose();
		// verifica que os campos nao estao vazios
		if (!tipoAccaoCompra.getText().isEmpty()
				&& !qtCompra.getText().isEmpty()
				&& !precoUnidCompra.getText().isEmpty()) {
			// verifica que os campos num�ricos recebem numeros positivos
			if (Integer.parseInt(qtCompra.getText()) > 0
					&& Double.parseDouble(precoUnidCompra.getText()) > 0) {
				// envia ordem de compra criada pelo utilizador
				client.sendOrder(order.createBuyOrder(nickName.getText(),
						tipoAccaoCompra.getText(),
						Integer.parseInt(qtCompra.getText()),
						Double.parseDouble(precoUnidCompra.getText())));
			}
		}
		// limpa os dados das jtextfield
		tipoAccaoCompra.setText(null);
		qtCompra.setText(null);
		precoUnidCompra.setText(null);
	}

	// Bot�o submitVenda foi carregado
	/**
	 * Este m�todo cria uma nova ordem de venda atrav�s createSellOrder(),
	 * enviando como parametros os dados introduzidos pelo utilizador
	 * precoUnidVenda, qtVenda, tipoAccaoVenda Envia essa ordem de venda para o
	 * servidor atrav�s do sendOrder() Adiciona ordem ao historico do utilizador
	 * - cliente Limpa as JTextFields Abre novamente a frame Menus
	 */
	@SuppressWarnings("static-access")
	private void submitVendaActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( menus )
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.validate();
		menus.pack();
		// fecha janela actual ( painelDeVenda )
		painelDeVenda.dispose();
		// verifica que os campos nao estao vazios
		if (!tipoAccaoVenda.getText().isEmpty() && !qtVenda.getText().isEmpty()
				&& !precoUnidVenda.getText().isEmpty()) {
			// verifica que os campos num�ricos recebem numeros positivos
			if (Integer.parseInt(qtVenda.getText()) > 0
					&& Double.parseDouble(precoUnidVenda.getText()) > 0) {
				// envia ordem de venda criada pelo utilizador
				client.sendOrder(order.createSellOrder(nickName.getText(),
						tipoAccaoVenda.getText(),
						Integer.parseInt(qtVenda.getText()),
						Double.parseDouble(precoUnidVenda.getText())));
				// String registoVenda=order.toString();
				// adiciona a nova ordem de venda � jtext historico
			}
		}
		// limpa os dados das jtextfield
		tipoAccaoVenda.setText(null);
		qtVenda.setText(null);
		precoUnidVenda.setText(null);
	}

	/**
	 * Retira precoUnidVenda da JTextField
	 */
	private void precoUnidVendaActionPerformed(ActionEvent evt) {
		this.precoUnidVenda = precoUnidVenda;
	}

	/**
	 * Retira qtVenda da JTextField
	 */
	private void qtVendaActionPerformed(ActionEvent evt) {
		this.qtVenda = qtVenda;
	}

	/**
	 * Retira tipoAccaoVenda da JTextField
	 */
	private void tipoAccaoVendaActionPerformed(ActionEvent evt) {
		this.tipoAccaoVenda = tipoAccaoVenda;
	}

	// Bot�o botaoVoltar foi carregado
	/**
	 * Volta � frame Menus
	 */
	private void botaoVoltarActionPerformed(ActionEvent evt) {
		// "lanca" nova janela ( menus )
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.validate();
		menus.pack();
		// fecha janela actual ( painelDeHistorico )
		painelDeHistorico.dispose();
	}

	public static void main(String args[]) {
		// try {
		// for (UIManager.LookAndFeelInfo info : UIManager
		// .getInstalledLookAndFeels()) {
		// if ("Nimbus".equals(info.getName())) {
		// UIManager.setLookAndFeel(info.getClassName());
		// break;
		// }
		// }
		// } catch (ClassNotFoundException ex) {
		// java.util.logging.Logger.getLogger(GUI.class.getName()).log(
		// java.util.logging.Level.SEVERE, null, ex);
		// } catch (InstantiationException ex) {
		// java.util.logging.Logger.getLogger(GUI.class.getName()).log(
		// java.util.logging.Level.SEVERE, null, ex);
		// } catch (IllegalAccessException ex) {
		// java.util.logging.Logger.getLogger(GUI.class.getName()).log(
		// java.util.logging.Level.SEVERE, null, ex);
		// } catch (UnsupportedLookAndFeelException ex) {
		// java.util.logging.Logger.getLogger(GUI.class.getName()).log(
		// java.util.logging.Level.SEVERE, null, ex);
		// }

		new GUI(client).run();
	}

	// vari�veis necess�rias � GUI
	public MicroTraderClientDummy micro;
	private JButton BotaoLigar;
	private JFrame menus;
	private JFrame painelDeHistorico;
	private JFrame painelDeVenda;
	private JFrame painelDeCompra;
	private JButton botaoDisconectar;
	private JButton botaoSubmitCompra;
	private JButton botaoSubmitVenda;
	private JButton botaoVerHistorico;
	private JButton botaoVoltar;
	private JLabel jLabel1;
	private JLabel jLabel10;
	private JLabel jLabel11;
	private JLabel jLabel2;
	private JLabel jLabel3;
	private JLabel jLabel4;
	private JLabel jLabel5;
	private JLabel jLabel6;
	private JLabel jLabel7;
	private JLabel jLabel8;
	private JLabel jLabel9;
	private JTextField nickName;
	private JTextField precoUnidCompra;
	private JTextField precoUnidVenda;
	private JTextField qtCompra;
	private JTextField qtVenda;
	private JButton submitCompra;
	private JButton submitVenda;
	private JTextArea textArea1;
	private JTextField tipoAccaoCompra;
	private JTextField tipoAccaoVenda;
	private static ClientCommDummy client;
	private static Order order = null;
	private JTextArea textAreaMessages;

	// func�o que permite inserir as ordem recebidas pelo servidor ( atrav�s de
	// mensagem ) no historico
	/**
	 * Este m�todo percorre a LinkedList e envia as ordens para o historico de
	 * cada utilizador Recebe como par�metro uma listaDeOrdens
	 * 
	 * @param listaDeOrdens
	 *            LinkedList<Order>
	 */
	public void insertHistorico(LinkedList<Order> listaDeOrdens) {
		textArea1.setText("");
		// percorre a lista de ordens recebida
		String registoCompra = "";
		for (Order order : listaDeOrdens) {
			// filtra as ordens recebidas de modo a adicionar apenas as do
			// utilizador em causa
			if (order.getNickname().equals(nickName.getText())) {
				// adiciona cada ordem ao historico

				if (!order.isBuyOrder())
					registoCompra += "[SELL]   ";
				else
					registoCompra += "[BUY]   ";
				registoCompra += "" + order.getStock() + " ("
						+ order.getNumberOfUnits() + ")  ["
						+ order.getPricePerUnit() + " EUR]\n";

			}
		}
		
		textArea1.setText(registoCompra);
		// actualiza o historico
		// getContentPane().repaint();
		// getContentPane().validate();
	}

	// func�o que permite inserir as ordem recebidas pelo servidor ( atrav�s de
	// mensagem ) na area de mensagens
	/**
	 * Este m�todo percorre a LinkedList e envia as ordens para o ecr� de
	 * mensagens de cada utilizador Recebe como par�metro uma listaDeOrdens
	 * 
	 * @param listaDeOrdens
	 *            LinkedList<Order>
	 */
	public void showMessages(LinkedList<Order> listaDeOrdens) {
		textAreaMessages.setText("");
		String registoCompra = "";
		// percorre lista de ordens recebida
		for (Order order : listaDeOrdens) {
			// filtra as ordens recebidas de modo a adicionar todas excepto as
			// do utilizador - n�o relevantes
			if (!order.getNickname().equals(nickName.getText())) {
				// adiciona cada ordem � area de mensagens
				if (!order.isBuyOrder())
					registoCompra += "[SELL]   ";
				else
					registoCompra += "[BUY]   ";
				registoCompra += "" + order.getStock() + " ("
						+ order.getNumberOfUnits() + ")  ["
						+ order.getPricePerUnit() + " EUR]\n";
				// adiciona a nova ordem de compra � jtext historico

			}

		}
		//System.out.println(registoCompra);
		textAreaMessages.setText(registoCompra);
		textAreaMessages.update(textAreaMessages.getGraphics());
		// actualiza o historico
		// //System.out.println("- >>>>>  "+textAreaMessages.getText().length());
		// menus.repaint();
		// menus.validate();
	}

	// func�o que inicializa a GUI
	/**
	 * Este m�todo executa a Gui
	 */
	public void run() {
		setVisible(true);
	}
}